import type { TreeSelectOption } from 'naive-ui'
import useStore from '@/stores'

/**
 * 将两个对象合并为一个对象，如果有相同的键，则使用目标对象的值
 * @param target 合并目标对象
 * @param source 合并源对象
 */
export function mergeObject(target: Record<string, any>, source: Record<string, any>) {
  for (const key in source) {
    if (source.hasOwnProperty(key)) {
      if (target.hasOwnProperty(key) && isObject(source[key])) {
        target[key] = mergeObject(target[key] || {}, source[key])
      } else {
        target[key] = source[key]
      }
    }
  }
  return target
}

/**
 * 获取数据的类型
 * @param obj 数据
 * @returns 数据类型
 */
export function getType(obj: any) {
  return Object.prototype.toString.call(obj).slice(8, -1)
}

/**
 * 是否为对象
 * @param obj 数据
 * @returns true or false
 */
export function isObject(obj: any) {
  return getType(obj) === 'Object'
}

/**
 * 将列表转为树形结构,返回固定格式
 * @param list  列表
 * @param id id
 * @param parentId parentId
 */
export function ListToTreeOption(
  list: any[],
  getKey: (obj: any) => number,
  getLabel: (obj: any) => string
): TreeSelectOption[] {
  const kData: Record<string, any> = {} // 以id做key的对象 暂时储存数据
  const lData: any[] = [] // 最终的数据 arr

  list.forEach(m => {
    m = {
      key: getKey(m),
      label: getLabel(m),
      parentId: +m.parentId || null
    } as TreeSelectOption
    delete m?.children
    kData[m.key] = {
      key: m.key,
      label: m.label,
      parentId: m.parentId
    }
    if (m.parentId === null) {
      lData.push(kData[m.key])
    } else {
      kData[m.parentId] = kData[m.parentId] || {}
      kData[m.parentId].children = kData[m.parentId].children || []
      kData[m.parentId].children.push(kData[m.key])
    }
  })
  return lData
}

/**
 * 将列表转为树形结构
 * @param list 列表
 * @param idKey 主id
 * @returns
 */
export function ListToTree(list: any[], idKey: string = 'id') {
  const kData: Record<string, any> = {} // 以id做key的对象 暂时储存数据
  const lData: any[] = [] // 最终的数据 arr

  list.forEach(m => {
    kData[m[idKey]] = m
    if (m.parentId === null) {
      lData.push(kData[m[idKey]])
    } else {
      kData[m.parentId] = kData[m.parentId] || {}
      kData[m.parentId].children = kData[m.parentId].children || []
      kData[m.parentId].children.push(kData[m[idKey]])
    }
  })
  return lData
}

export function useDict(key: string) {
  const { dict } = useStore()
  const dictData = dict.getDict(key)
}
